/**
 * 谁接收，谁定义
 */

// 转换前的结构
import { ArrItem } from './types/tree.d'

const list: ArrItem[] = [
  { id: 1, name: '用户管理', pid: 0, path: 'user' },
  { id: 2, name: '菜单申请', pid: 1, path: 'setting' },
  { id: 3, name: '信息申请', pid: 1, path: 'msg' },
  { id: 4, name: '模块记录', pid: 2, path: 'model' },
  { id: 5, name: '系统设置', pid: 0, path: 'system' },
  { id: 6, name: '权限管理', pid: 5, path: 'auth' },
  { id: 7, name: '用户角色', pid: 6, path: 'role' },
  { id: 8, name: '菜单设置', pid: 6, path: '菜单设置' },
]
// 1. 父 parents
// 2. 子 children
// 3. 遍历的过程中，就是要把子pid跟父id相等的放置在父的children下
// 4. 判断父是否有children
// 5. 如果有children 直接push
// 6. 如果没有children 创建children=[],并且把子符合内容放在数组中
// 7. 如果children内部还有后续元素，继续以上6步 借助递归
// 注意：要把每一个处理后的子的元素，删除掉，然后重新放置在递归函数中，
// （这个元素我已经处理过了，不再处理了，删除掉就可以不处理了）
// 但是删除采用splice会影响 数组，所以，在这个地方，会有一个拷贝
// 只针对拷贝的数据，进行删除，然后，将处理好的children,递归进一步循环
function filterList(list: ArrItem[]) {
  const parents = list.filter((v) => v.pid === 0)
  const children = list.filter((v) => v.pid !== 0)
  listToTree(parents, children)
  return parents
}

function listToTree(parents: ArrItem[], children: ArrItem[]) {
  parents.forEach((p) => {
    children.forEach((item, i) => {
      if (p.id === item.pid) {
        // 提升循环效率
        let _copy = JSON.parse(JSON.stringify(children))
        _copy.splice(i, 1)
        listToTree([item], _copy)
        if (p.children) {
          p.children.push(item)
        } else {
          p.children = [item]
        }
      }
    })
  })
}

// const treeList: ArrItem[] = []
let res = filterList(list)
console.log(res, 'res')
